/**
 * Created with CLion.
 * Description: 
 * User: loong
 * Date: 2023/12/24
 * Time: 22:08
 */

#include "NodeImpl.h"

namespace Config {

    NodeImpl::NodeImpl(std::string _tag, std::string _value)
        : tag_name_(_tag)
        , value_(_value)
    {
    }

    NodeImpl::NodeImpl()
        : tag_name_()
        , value_()
    {
    }

    /* xml_node Node::NodeImpl::ToDocument()
    {
        doc_.remove_children();
        xml_node root_node = doc_.append_child(this->tag_name_.c_str());

        // 增加属性
        auto attr_ite = this->attribute_.begin();
        while(attr_ite != this->attribute_.end()) {
            root_node.append_attribute(attr_ite->first.c_str()) = attr_ite->second.c_str();
            ++attr_ite;
        }

        // 增加值内容
        if(!value_.empty())
            root_node.append_child(pugi::node_pcdata).set_value(value_.c_str());

        //增加子节点
        for(auto child : this->children_list_) {
            auto node_doc = child->node_impl_->ToDocument();
            if(!node_doc.empty())
                root_node.append_copy(node_doc);
        }

        return root_node;
    }*/

    xml_document NodeImpl::ToXmlNode(NodeSPtr _node)
    {
        xml_document doc;
        xml_node root_node = doc.append_child(_node->TagName().c_str());

        // 增加属性
        auto attrs = _node->Attrs();
        auto attr_ite = attrs.begin();
        while(attr_ite != attrs.end()) {
            root_node.append_attribute(attr_ite->first.c_str()) = attr_ite->second.c_str();
            ++attr_ite;
        }

        // 增加值内容
        if(!_node->Value().empty())
            root_node.append_child(pugi::node_pcdata).set_value(_node->Value().c_str());

        //增加子节点
        for(auto child : _node->Children()) {
            auto node_doc = ToXmlNode(child);
            if(node_doc.empty())
                continue;

            for(auto c : node_doc.root().children())
                root_node.append_copy(c);
        }

        return doc;
    }

    NodeSPtr NodeImpl::ToNode(xml_node _node)
    {
        auto ret = std::make_shared<Node>(_node.name(), _node.value());

        auto attrs = _node.attributes();
        for(const auto &item : attrs)
            ret->AddAttr(item.name(), item.value());

        auto childs = _node.children();
        for(const auto &item : childs)
            ret->AddChildren({ToNode(item)});

        return ret;
    }
}// namespace Config